<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 	* 声明一定要赋初始值:一旦声明常量，就必须立即初始化，不能留到以后赋值
    // 	>  `const` 声明一个只读变量，声明之后不允许改变。意味着，一旦声明必须初始化，否则会报错。
	// {
	// 	const a =1;
    // }
    // 	* 值不允许修改
	// {
	// 	const b = 2;
	// 	b = 3;
    // }

    // 	>const 其实保证的不是变量的值不变，而是保证变量指向的内存地址不允许改动。
    // 	所以 使用 const 定义的对象或者数组，其实是可变的。 </font>
	{
		// 基本数据类型：字符串 数字  布尔  null undefined
        // 引用数据类型：对象 数组 函数
        // const a = 1;
		// const b = 1;
		// console.log(a === b);// true

        // const obj = {
		// 	a:1
        // }
		// const obj2 = {
		// 	a:1
        // }
		// console.log(obj === obj2);// false

        // const obj = {
		// 	a:1
        // }
		// const obj2 = obj;
		// console.log(obj === obj2);
		// obj2.a = 100;
		// console.log(obj);

		// 金庸 鹿鼎记 韦小宝 7
        // 埋雷

        // const obj = {
		// 	a:1
        // }
		// obj.a = 200;
		// console.log(obj.a)



    }
    // 	- `const`只在声明所在的块级作用域内有效。（与let相同）
	// {
	// 	const a = 1;
	// 	console.log(a);
    // }
	// console.log(a);

    //  - `const`命令声明的常量也是不会提升（与let相同）
	{
		// console.log(a);
		// const a = 1;
		// console.log(a);
    }
    // - `const`不可重复声明（与let相同）
	{
		// const a = 1;
		// const a = 2;
    }
    //  - 不再是顶层全局对象的属性（与let相同）
    // 	>  let命令、`const`命令、class命令声明的全局变量，不属于顶层对象的属性。也就是说，从 `ES6 `开始，全局变量将逐步与顶层对象的属性脱钩。
	{
		const a = 1;
		console.log(a,window.a);// 1 undefined
    }
    // 	* <font color="red">const使用的两点建议：</font>
    //
    // 	> <font color="red">1、被多次使用且不允许更改的数据建议通过const定义;</font>
    // 	> <font color="red">2、项目全局常量建议大写，单词之间用-分隔；</font>
    // 	> 3、如果不清楚要使用let还是const,那么就用const。如果后面发生值的改变，那么再将const改成let.
    // 	> 4、以后不允许使用var

</script>
</html>